#include "RS485.h"
#include "stm32f10x.h"
#include "tocs_protocol.h"
#include "string.h"

#define RS_RECV_TIMEOUT			4


extern void TOCS_Recv(uint8_t *data,uint8_t len);


static void RS_IO_Init(void);

struct s_RS_Receive RS_Receive;

struct s_RS_Send RS_Send;

static RECV_FUNC Recv_Func;

/***************************************************************************************
名称： 	RS_App_Init																	
功能： 	RS485接收接口初始化														
输入：	N/A																			     			    			     													       								 												
输出：	N/A															
****************************************************************************************/
void RS_App_Init(RECV_FUNC p_recv)
{
	Recv_Func = p_recv;
}
/***************************************************************************************
名称： 	RS_Tmr_Init																	
功能： 	RS485初始化															
输入：	N/A																			     			    			     													       								 												
输出：	N/A															
****************************************************************************************/
void RS_Tmr_Init(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

    TIM_TimeBaseStructure.TIM_Period = (100 - 1);

    TIM_TimeBaseStructure.TIM_Prescaler = (720 - 1);

    TIM_TimeBaseStructure.TIM_ClockDivision = 0;

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

    TIM_ClearITPendingBit(TIM2, TIM_IT_Update);

    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);

    TIM_Cmd(TIM2, DISABLE); 
}
/***************************************************************************************
名称： 	RS_Init																	
功能： 	RS485初始化															
输入：	N/A																			     			    			     													       								 												
输出：	N/A															
****************************************************************************************/
void RS_Init(void)
{
	RS_IO_Init();
	RS_Tmr_Init();
	RS_Receive.active = 0;
}
/***************************************************************************************
名称： 	RS_IO_Init																	
功能： 	IO初始化															
输入：	N/A																			     			    			     													       								 												
输出：	N/A															
****************************************************************************************/
void RS_IO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
    
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	
	GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_Init(GPIOB , &GPIO_InitStructure);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
              
	USART_InitStructure.USART_BaudRate = 9600;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_Init(USART1, &USART_InitStructure);
		 
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  //接收中断
	USART_ITConfig(USART1, USART_IT_TC, DISABLE);
	USART_Cmd(USART1, ENABLE);
   
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_Init(GPIOB,&GPIO_InitStructure);  	
	GPIO_ResetBits(GPIOB, GPIO_Pin_5);       //485EN 接收状态
		
	RS_Receive.active = 0;
	RS_Receive.len = 0;
	memset(RS_Receive.buf, 0, sizeof(RS_Receive.buf));
	RS_Send.valid = 0;
	RS_Send.cnt = 0;
	memset(RS_Send.buf, 0, sizeof(RS_Send.buf));

	RS485_SEND_DISABLE;
}
/***************************************************************************************
名称： 	RS_Receive_Init																	
功能： 	初始化RS_Receive														
输入：	N/A																			     			    			     													       								 												
输出：	N/A															
****************************************************************************************/
void RS_Receive_Init(void)
{
	RS_Receive.len = 0;
	RS_Receive.flag = 0;
}
/***************************************************************************************
名称： 	RS_Receive_Data																	
功能： 	RS接受数据															
输入：	N/A																			     			    			     													       								 												
输出：	N/A															
****************************************************************************************/
void RS_Receive_Data(uint8_t data)
{
	if(RS_Receive.active == 0)
	{
		RS_Receive_Init();
		TIM_Cmd(TIM2, ENABLE);
	}

	RS_Receive.active = RS_RECV_TIMEOUT;

	if(RS_Receive.len < RS_RECV_BUF_LEN_MAX)
	{
		RS_Receive.buf[RS_Receive.len] = data;
		RS_Receive.len ++;
	}
}
/***************************************************************************************
名称： 	RS_Receive_Data																	
功能： 	RS接受数据															
输入：	N/A																			     			    			     													       								 												
输出：	N/A															
****************************************************************************************/
void RS485_Senddata(uint8_t len, uint8_t *ptr)
{
	RS485_SEND_ENABLE;
	for(; len>0; len--)
	{
		while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
		USART_SendData(USART1, *ptr);
		ptr ++;
	}
	while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
	RS485_SEND_DISABLE;
}

/***************************************************************************************
名称： 	RS_Tmr_Fire																	
功能： 	RS接受数据															
输入：	N/A																			     			    			     													       								 												
输出：	N/A															
****************************************************************************************/
void RS_Tmr_Fire(void)
{
	RS_Receive.active--;
	if(RS_Receive.active == 0)
	{
		TIM_Cmd(TIM2, DISABLE);
		if(Recv_Func != NULL)
			(*Recv_Func)(RS_Receive.buf,RS_Receive.len);
	}
}
/***************************************************************************************
名称： 	RS485_App_Check																	
功能： 	RS接受数据															
输入：	N/A																			     			    			     													       								 												
输出：	N/A															
****************************************************************************************/
void RS485_App_Check(void)
{
	if(RS_Receive.len)
	{
		if(RS_Receive.flag >= 2)
		{
			RS_Receive_Init();
		}
		else if(RS_Receive.flag == 1)
		{
			RS_Receive.flag++;
		}
		else
		{
			RS_Receive.flag = 1;
		}
	}
	else
	{
		RS_Receive.flag = 0;
	}
}
































